"""
@Author : 合肥一元数智教育科技有限公司
@Date :  2025/3/18 10:31
@Description :   socket的服务端
1. 导入模块
2. 创建socket对象
3. 绑定socket参数
4. 启动服务端监听客户端连接
"""
import socket
import threading
from concurrent.futures import ThreadPoolExecutor

# 创建socket 服务端对象  套接字的family  AF_INET   type  SOCK_STREAM 面向连接的tcp协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置服务端对象参数  接收客户端的连接  ip  port   0-65535
server_socket.bind(('127.0.0.1', 9999))
# 设置服务端对象允许挂起的连接个数
server_socket.listen(2)


def client_handler(client_socket):
    while True:
        # 获取客户端发送的数据
        message = client_socket.recv(1024).decode('utf-8')
        if message:
            print('client send a message: ', message)
            # 返回信息给客户端
            client_socket.send(message.upper().encode('utf-8'))
        else:
            break
    # 释放资源
    client_socket.close()


# 程序会在此阻塞  等待客户端连接 一旦有客户端连接，则程序继续向下执行
print("服务器启动成功,等待客户端连接...")

# 创建线程池对象
thread_pool = ThreadPoolExecutor(max_workers=5)
client_sockets = []
while True:
    client_socket, client_addr = server_socket.accept()
    # 存储client_socket用于群发
    print("一个客户端连接了...")
    # 创建线程  将发送和收取信息的任务交给子线程处理
    # client_thread = threading.Thread(target=client_handler, args=(client_socket,))
    thread_pool.submit(client_handler, client_socket)

server_socket.close()
